/**
 * @NetUtils.as
 *
 * @author sodaChen mail:asframe@qq.com
 * @version 1.0
 * <br>Copyright (C), 2013 asFrame.com
 * <br>This program is protected by copyright laws.
 * <br>Program Name:DragonBall
 * <br>Date:2017-3-10
 */
package com.asframe.utils
{
	import flash.utils.ByteArray;

	/**
	 * 网络通讯相关的工具方法集合
	 * @author sodaChen
	 * Date:2017-3-10
	 */
	public class NetUtils
	{
		/**
		 * 写可变的整形数据类型 
		 * @param bytes 二进制数组
		 * @param value
		 * 
		 */		
		public static function writeVaryInt(bytes:ByteArray,value:int):void
		{
			//用-128、-127,-126来做标识符，分别表示short int 和long
			//写byte
			if(value <= 127 && value > -126)
			{
				bytes.writeByte(value);
				return ;
			}
			if(value <= 32767 && -value >= -32768)
			{
				//short -128
				bytes.writeByte(-128);
				bytes.writeShort(value);
				return ;
			}
			if(value <= 2147483647 && -value >= -2147483648)
			{
				//int -127
				bytes.writeByte(-127);
				bytes.writeInt(value);
				return ;
			}
			//剩下的都是long了
			bytes.writeByte(-126);
			bytes.writeDouble(value);
		}
		/**
		 * 读取可变长度的整形数据 
		 * @param bytes 二进制数据
		 * @return 相应的整形i
		 */		
		public static function readVaryInt(bytes:ByteArray):Number
		{
			var type:int = bytes.readByte();
			//byte
			if(type <= 127 && type > -126)
				return type;
			//short
			if(type == -128)
				return bytes.readShort();
			//int
			if(type == -127)
				return bytes.readInt();
			//double(long)
			return bytes.readDouble();
		}
		/**
		 * 动态写数组的长度
		 * @param bytes
		 * @param ary
		 *
		 */
		public static function writeArySize(bytes:ByteArray,ary:Array):void
		{
			//数组的int长度比较清晰，不会有负的，所以采用-1来表示
			var len:int = ary.length;
			if(len <= 127 )
			{
				bytes.writeByte(len);
				return ;
			}
			if(len <= 32767)
			{
				//写个标识符
				bytes.writeByte(-1);
				//写个short的长度
				bytes.writeShort(length);
				return ;
			}
			//剩下都写int了，long不用想，太可怕
			bytes.writeByte(-2);
			//写个short的长度
			bytes.writeInt(length);
		}
		/**
		 * 读取数组的动态长度
		 * @param bytes 二进制数组对象
		 * @return
		 */
		public static function readArySize(bytes:ByteArray):int
		{
			var len:int = bytes.readByte();
			if(len == -1)
				return bytes.readShort();
			else if(len == -2)
				return bytes.readInt();

			return len;
		}
	}
}